【问题解决】记录一次EasyExcel2.2.6版本内存泄漏问题 您所在的位置:网站首页 xmlbeans 230 漏洞 【问题解决】记录一次EasyExcel2.2.6版本内存泄漏问题

【问题解决】记录一次EasyExcel2.2.6版本内存泄漏问题

2024-07-14 00:08| 来源: 网络整理| 查看: 265

【问题解决】记录一次EasyExcel2.2.6版本内存泄漏问题

"目录:" 1.问题现象2.本地调试3.问题修改

1.问题现象

​ 生成Excel文件后,JVM内存一直没有释放

2.本地调试

​ 使用工具:Idea、VisualVM

(1)监控占用内存统计信息:

执行前: 在这里插入图片描述

执行后:

org.apache.xmlbeans.impl.store.Xobj$AttrXobj 131,110,368 B (11.4%) 1,365,733 (6.6%)

org.apache.xmlbeans.impl.store.Xobj$ElementXobj 87,829,440 B (7.3%) 914,890 (3.3%)

发现上面两个对象一直不释放,怀疑内存泄漏

(2)导出dump文件

jmap -dump:live,format=b,file=mydump.hprof 22176

(3)使用Mat分析

定位到ExcelWriter中重写了finalize方法,导致在GC队列中,具体参考:https://www.if98.com/1355913552/linux/177318.html

3.问题修改

​ 由于项目一直用的2.2.6版本,如果升级版本到3.1.X(官方移除finalize重写在该版本)影响较大,无法评估工作量,所以使用javaassit工具直接修改class文件移除ExcelWriter和ExcelReader中的finalize方法。

org.javassist javassist 3.27.0-GA public static void main(String[] args) throws NotFoundException, CannotCompileException, IOException { ClassPool pool = ClassPool.getDefault(); pool.insertClassPath("D:\\env\\repository-nexus\\com\\alibaba\\easyexcel\\2.2.6\\easyexcel-2.2.6.jar"); CtClass ctClass = pool.get("com.alibaba.excel.ExcelWriter"); CtMethod ctm = ctClass.getDeclaredMethod("finalize"); ctClass.removeMethod(ctm); CtClass ctClass1 = pool.get("com.alibaba.excel.ExcelReader"); CtMethod ctm1 = ctClass1.getDeclaredMethod("finalize"); ctClass1.removeMethod(ctm1); ctClass.writeFile("D:\\env\\repository-nexus\\com\\fp\\javassis"); ctClass1.writeFile("D:\\env\\repository-nexus\\com\\fp\\javassis"); }

​ 上传到公司私服,exclude com.alibaba.easyexcel,引入新的包

com.fengpin fp-core-base com.alibaba easyexcel com.fp.easyexcel easyexcel 2.2.6

问题解决

………………



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有